/* Three.js 扩展类型 */

// MARK: 数据结构 ---------------------------------------------------------------------------------

export interface Dictionary<T> {
  [key: string]: T;
}

// MARK: 数字 -------------------------------------------------------------------------------------

// 数字x2: 二维点坐标
export type Number2 = [number, number];
// 数字x3: 三维点坐标
export type Number3 = [number, number, number];
// 数字x4: 暂时没用
export type Number4 = [number, number, number, number];
// 数字x5: 相机位置
export type Number5 = [number, number, number, number, number];
// 数字x6: 暂时没用
export type Number6 = [number, number, number, number, number, number];

// MARK: 旋转 -------------------------------------------------------------------------------------

// 旋转设置
// TODO 改为 yaw, pitch, roll
// export type RotationConfig = { x?: number; y?: number; z?: number }

/** 场景节点用户数据，即 Object3D.userData */
export type SceneNodeData = {
  // 【模型物体】
  // 持久化数据（ModelConfig 内）
  modelId: string; // 模型ID
  modelName: string; // 模型名称
  // name: string // 物体名称。不用 userData 保存，用 Object3D:name
  code: string; // 物体编号
  renderMode: ModelRenderMode; // 渲染模式
  specialAttribute: object; // 特有属性
  defaultStateSettings?: StateAspectSetting[]; // 默认状态设置
  materialReplacements?: ModelMaterialReplaceConfig[]; // 模型材质替换设置
  // 临时数据
  isModel?: boolean; // 是否为模型
  isGroup?: boolean; // 是否为组
  expanded?: boolean; // 是否已展开（仅用于世界大纲里）
  locked?: boolean; // 是否已锁定（仅用于世界大纲里）
  searchMatched?: boolean; // 关键字搜索匹配成功（仅用于世界大纲里）

  // 【非模型物体】
  // 场景根容器
  isModelGroup?: boolean; // 是否为 ModelGroup（场景内所有模型的根容器）findModelByUuid 和 findModelByCode 会用到
  // 辅助器根容器
  isHelperGroup?: boolean; // 是否为 HelperGroup（场景内所有辅助器（非模型）的根容器）
  // 文字状态容器
  isTextGroup?: boolean; // 是否为 TextGroup（物体内多个文字状态的容器）
  // 文字对象
  isTextObject?: boolean; // 是否为 TextObject（文字对象）
  textObjectStateAspectName?: string; // 此 TextObject 对应的状态方面
  // 物体风格线框
  isFrameGenerated?: boolean; // （仅模型物体上会有）是否已经为模型物体生成了线框物体
};

export type ModelRenderMode = "SCENE_OBJECT_STYLE" | "REALISTIC";

/** 模型状态设置（目前只有初始状态会用到） */
export type StateAspectSetting = {
  // 状态方面名称
  aspectName: string;
  // 状态值，对于“颜色、位置、旋转”状态方面类型，它是状态值的名称（StateValue.name）
  // 而对于“文字”状态方面类型，它是要显示的文字
  stateValue: string;
};

/** 模型材质替换设置 */
export type ModelMaterialReplaceConfig = {
  meshIndex: number;
  materialId: string;
};
